module ALU(
    input [31:0] a,   // ALU 输入操作数 a
    input [31:0] b,   // ALU 输入操作数 b
    input [3:0] op,   // ALU 操作码
    output reg [31:0] f,  // ALU 计算结果
    output reg c     // 进位标志
    );

    always @(*) begin
        c = 0;  // 默认情况下，进位标志为 0
        case(op)
            4'b0000: f = 32'b0;  // 操作码 0000: 结果为 0
            4'b0001: {c, f} = a + b;  // 操作码 0001: 执行加法操作，c 捕获进位标志
            4'b0010: f = a - b;  // 操作码 0010: 执行减法操作
            4'b0011: f = a & b;  // 操作码 0011: 执行按位与操作
            4'b0100: f = a | b;  // 操作码 0100: 执行按位或操作
            4'b0101: f = a ^ b;  // 操作码 0101: 执行按位异或操作
            4'b0110: f = a << b;  // 操作码 0110: 执行左移操作
            4'b0111: f = a >> b;  // 操作码 0111: 执行右移操作
            4'b1000: f = a >>> b; // 操作码 1000: 执行算术右移操作
            default: f = 32'b0;  // 默认情况下，结果为 0
        endcase
    end

    initial begin
        $monitor($time, " ALU: a=%h, b=%h, op=%b, result=%h, c=%b", a, b, op, f, c);
    end
endmodule
